package logica;

import jugador.Jugador;
import unidades.Unidad;

/**
 * Clase que gestiona el turno actual en una partida
 *
 * @author Ibai
 */
public class Turno {

    private Jugador jugadorActivo;
    private int puntosAccion;
    private Partida partida;
    private final int PUNTOS_BASE = 5;

    /**
     * Inicializa un nuevo turno para un jugador y establece los puntos
     * de acción para ese jugador con la base por defecto
     *
     * @param j El jugador al que se le asigna el turno
     * @param p Partida sobre la que gestionar el turno
     */
    public Turno(Jugador j, Partida p) {
        jugadorActivo = j;
        partida = p;
        puntosAccion = PUNTOS_BASE;
    }

    /**
     * Inicializa un nuevo turno para un jugador y establece sus puntos de acción
     *
     * @param j El jugador al que se le asigna el turno
     * @param puntos El número de puntos para el jugador este turno
     */
    public Turno(Jugador j, Partida p, int puntos) {
        this(j, p);
        puntosAccion = puntos;
    }

    /**
     * Devuelve el jugador que tiene el turno
     *
     * @return El jugador activo en el turno
     */
    public Jugador getJugadorActivo() {
        return jugadorActivo;
    }

    /**
     * Establece el nuevo jugador activo
     *
     * @param jugadorActivo El nuevo jugador que tiene el turno
     */
    public void setJugadorActivo(Jugador jugadorActivo) {
        this.jugadorActivo = jugadorActivo;
    }

    /**
     * Devuelve los puntos de acción que quedan este turno
     * 
     * @return Los puntos de acción
     */
    public int getPuntosAccion() {
        return puntosAccion;
    }

    /**
     * Establece los puntos de acción para este turno
     *
     * @param puntosAccion La nueva cantidad de puntos de acción
     */
    public void setPuntosAccion(int puntosAccion) {
        this.puntosAccion = puntosAccion;
    }

    /**
     * Reinicia el turno y se lo asigna a un nuevo jugador. También restablece
     * los puntos de acción
     *
     * @param nuevoJugador El nuevo jugador que tiene el turno
     */
    public void resetTurno() {
        for (Unidad u : jugadorActivo.getEquipo().getUnidades()) {
            u.bloquear();
        }
        if (jugadorActivo == partida.getJugadorA()) {
            jugadorActivo = partida.getJugadorB();
        } else {
            jugadorActivo = partida.getJugadorA();
        }
        puntosAccion = PUNTOS_BASE;
        for (Unidad u : jugadorActivo.getEquipo().getUnidades()) {
            u.resetState();
        }
    }

    /**
     * @param partida the partida to set
     */
    public void setPartida(Partida partida) {
        this.partida = partida;
    }
}
